package com.xbongbong.formula.qlexpress.operator.date;

import com.ql.util.express.Operator;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.util.Arith;
import com.xbongbong.pro.enums.ErrorCodeEnum;
import com.xbongbong.pro.enums.errorcodes.BusinessRuleErrorCodeEnum;
import com.xbongbong.saas.constant.BasicConstant;

import java.util.Objects;

/**
 * 返回日期date的年份
 * @author 吴峰
 * @version v1.0
 * @date 2019/8/5 10:47
 * @since v1.0
 */
public class OperatorTime extends Operator {

    private static final Integer HOUR = 24;

    /**
     * 24 * 60
     * */
    private static final Integer MINUTE = 1440;
    /**
     *  24 * 60* 60
     */
    private static final Integer SECOND = 86400;

    /**
     * 小数位数，和前端保持一致
     */
    private static final Integer SCALE = 8;


    public OperatorTime(String name){
        this.name = name;
    }

    public OperatorTime(String aliasName, String aName, String errorInfo){
        this.aliasName = aliasName;
        this.name = aName;
        this.errorInfo = errorInfo;
    }

    /**
     * TIME(hour, minute, second)
     * 返回特定时间的十进制数字。时间值为日期值的一部分，并用十进制数表示（例如 12:00 PM 可表示为 0.5，因为此时是一天的一半）。
     * hour: 必需。 0（零）到 32767 之间的数字，代表小时。 任何大于 23 的值都会除以 24，余数将作为小时值。 例如，TIME(27,0,0) = TIME(3,0,0) = .125
     * minute: 必需。 0 到 32767 之间的数字，代表分钟。 任何大于 59 的值将转换为小时和分钟。 例如，TIME(0,750,0) = TIME(12,30,0) = .520833
     * second: 必需。 0 到 32767 之间的数字，代表秒。 任何大于 59 的值将转换为小时、分钟和秒。 例如，TIME(0,0,2000) = TIME(0,33,20) = .023148
     * 将日期对象转换成时间戳。
     * @param list
     * @return
     * @throws Exception
     */
    @Override
    public Object executeInner(Object[] list) throws XbbException {
        if (Objects.isNull(list)) {
            throw new XbbException(BusinessRuleErrorCodeEnum.API_ERROR_261007);
        }
        if (list.length != BasicConstant.THREE) {
            throw new XbbException(BusinessRuleErrorCodeEnum.API_ERROR_261007);
        }
        Double result = 0D;
        if (list[0] == null) {
            list[0] = 0;
        }
        if (list[1] == null) {
            list[1] = 0;
        }
        if (list[2] == null) {
            list[2] = 0;
        }
        Integer hour = Integer.valueOf(String.valueOf(list[0]));
        if (Objects.nonNull(hour)) {
            // 用小时数除以24，得出结果
            result = Arith.div(hour, HOUR);
        }
        Integer minute = Integer.valueOf(String.valueOf(list[1]));
        if (Objects.nonNull(minute)) {
            // 用小时数除以1440，得出结果
            result = Arith.add(Arith.div(minute, MINUTE), result);
        }
        Integer second = Integer.valueOf(String.valueOf(list[2]));
        if (Objects.nonNull(second)) {
            // 用秒数除以86400，得出结果
            result = Arith.add(Arith.div(second, SECOND), result);
        }
        return Arith.round(result, SCALE);
    }

}
